#ifndef ___fat32_fs

#define ___fat32_fs 1

#include "f32_acon.c"
#include "f32_fsbs.c"
#include "f32_fat.c"

void fat32_fs_init(void);
void fat32_obtener_bootsector(void *);
void fat32_procesar_bootsector(void *);

void fat32_fs_init (void) {
  char[512] bsbuf;
  fat32_obtener_bootsector(bsbuf);
  fat32_procesar_bootsector(bsbuf);
  fat32_inicializar_FAT((bootsector.cantidadSectores - bootsector.sectoresReservados - (bootsector.copiasFAT * bootsector.sectoresPorFAT)) /
                        bootsector.sectoresPorCluster, bootsector.sectoresReservados, bootsector.FATactiva, bootsector.copiasFAT,
                        bootsector.sectoresPorFAT);
}

int fat32_procesar_bootsector (void * buf) {
  char * buffer = buf;
  bootsector.sectoresPorCluster = buffer[13];
  switch (bootsector.sectoresPorCluster) {
    case 1: case 2: case 4: case 8: case 16: case 32: case 64: break;
    default: return 1;
  }
  bootsector.sectoresReservados = fb_convertir_de_little_endian(buffer + 14, 2);
  if (!bootsector.sectoresReservados) return 2;
  bootsector.copiasFAT = buffer[16]
  if (!bootsector.copiasFAT || (bootsector.copiasFAT > 16)) return 3;
  bootsector.cantidadSectores = fb_convertir_de_little_endian(buffer + 32, 4);
  if (!bootsector.cantidadSectores) return 4;
  bootsector.sectoresPorFAT = fb_convertir_de_little_endian(buffer + 36, 4);
  if (!bootsector.sectoresPorFAT) return 5;
  if (buffer[40] & 128) bootsector.FATactiva = 255; else bootsector.FATactiva = (buffer[40] & 15);
  if ((bootsector.FATactiva != 255) && (bootsector.FATactiva >= bootsector.copiasFAT)) return 6;
  bootsector.clusterInicioRaiz = fb_convertir_de_little_endian(buffer + 44, 4);
  if (bootsector.clusterInicioRaiz < 2) return 7;
  return 0;
}

int fat32_obtener_bootsector (void * buffer) {
  unsigned int conexion = fat32_obtener_conexion_disponible();
  mti_mensaje mensaje;
  mtf_enviar_mensaje(fat32_centro_mensajes, conexion, MTE_LEER_SECTOR, (long) 0);
  recibir:
  while (!mtf_recibir_mensajes(fat32_centro_mensajes));
  mensaje = mtf_siguiente_mensaje(fat32_centro_mensajes);
  if ((mensaje.remitente != conexion) || (mensaje.categoria != MTA_MENSAJE) || 
      ((mensaje.tipo != MTR_DATOS_SECTOR) && (mensaje.tipo != MTR_NO_LEYO_SECTOR))) {
    mtf_descartar_mensaje(fat32_centro_mensajes, mensaje.codigo);
    goto recibir;
  }
  if (mensaje.tipo == MTR_NO_LEYO_SECTOR) {
    mtf_descartar_mensaje(fat32_centro_mensajes, mensaje.codigo);
    return 1;
  }
  mtf_obtener_datos(fat32_centro_mensajes, mensaje.codigo, NULL, &buffer);
  mtf_descartar_mensaje(fat32_centro_mensajes, mensaje.codigo);
  return 0;
}

#endif